package com.haisen.service.impl;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.haisen.core.utils.PageResultSet;
import com.haisen.dataobject.dto.ItemParamGroupDto;
import com.haisen.dataobject.dto.RoleDto;
import com.haisen.dataobject.entity.ItemCat;
import com.haisen.dataobject.entity.ItemParamGroup;
import com.haisen.dataobject.entity.ItemParamKey;
import com.haisen.dataobject.mapper.base.ItemCatMapper;
import com.haisen.dataobject.mapper.base.ItemParamGroupMapper;
import com.haisen.dataobject.query.ItemParamGroupQuery;
import com.haisen.service.ItemParamGroupService;
import com.haisen.service.ItemParamKeyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import tk.mybatis.mapper.weekend.Weekend;
import tk.mybatis.mapper.weekend.WeekendCriteria;

import java.util.*;
import java.util.stream.Collectors;

@Service
@Slf4j
public class ItemParamGroupServiceImpl implements ItemParamGroupService {

    @Autowired
    ItemParamGroupMapper itemParamGroupMapper;

    @Autowired
    ItemCatMapper itemCatMapper;

    @Autowired
    ItemParamKeyService itemParamKeyService;

    @Override
    public void create(ItemParamGroup itemParamGroup) {
        itemParamGroupMapper.insertSelective(itemParamGroup);
    }

    @Override
    public void update(ItemParamGroup itemParamGroup) {
         itemParamGroupMapper.updateByPrimaryKeySelective(itemParamGroup);
    }

    @Override
    public void delete(Long id) {
        itemParamGroupMapper.deleteByPrimaryKey(id);
    }

    @Override
    public void deleteBatch(Long[] ids) {
        //删除列表
        Weekend<ItemParamGroup> example = Weekend.of(ItemParamGroup.class);
        WeekendCriteria<ItemParamGroup ,Object> criteria = example.weekendCriteria();
        criteria.andIn(ItemParamGroup :: getId, Arrays.stream(ids).collect(Collectors.toList()));
        itemParamGroupMapper.deleteByExample(example);
    }

    @Override
    public ItemParamGroup findOneById(Long id) {
        return itemParamGroupMapper.selectByPrimaryKey(id);
    }

    @Override
    public List<ItemParamGroup> find(Weekend example) {
        return itemParamGroupMapper.selectByExample(example);
    }

    @Override
    public List<ItemParamGroup> findAll() {
        return itemParamGroupMapper.selectAll();
    }


    @Override
    public PageResultSet<ItemParamGroupDto> findByPage(ItemParamGroupQuery itemParamGroupQuery) {
        /**
         * 是否有排序
         */
        if (!StringUtils.isEmpty(itemParamGroupQuery.getOrderBy())){
            PageHelper.orderBy(itemParamGroupQuery.getOrderBy());
        }
        /**
         * 查询语句
         */
        Weekend<ItemParamGroup> example = Weekend.of(ItemParamGroup.class);
        WeekendCriteria<ItemParamGroup,Object> criteria = example.weekendCriteria();
        if (!StringUtils.isEmpty(itemParamGroupQuery.getName())){
            criteria.andLike(ItemParamGroup::getGroupName,"%"+itemParamGroupQuery.getName()+"%");
        }
        //传输对象dto
        PageResultSet<ItemParamGroupDto> resultSet = new PageResultSet<>();
        List<ItemParamGroupDto> dtoList = new ArrayList<>();
        //查询的是groups列表，遍历每一个对象的keyNames
        itemParamGroupMapper.selectByExample(example).forEach(o -> {
            //将角色转换为roldDto对象传输
            ItemParamGroupDto dto = new ItemParamGroupDto(o);
            //相比role,roledto多了个resourename,这里遍历出resouceName名称
           // dto.setItemKeyNames(getItemParamKeyNames(o.getItemKeyList()));
            dtoList.add(dto);
        });

        //获取产品类目列表
        /*List<ItemCat> itemCatList = itemCatMapper.selectAll();
        Map<Integer,String> itemCatMap = new HashMap<>();
         itemCatList.forEach(e ->{
             itemCatMap.put(e.getId().intValue(),e.getName());
         });

         log.info("map:{}",itemCatMap);
         log.info("lis:{}",JSON.toJSONString(itemParamGroupList));
         //DTO
        List<ItemParamGroup> itemParamGroupDTOS = new ArrayList<>();

        itemParamGroupList.forEach(e ->{
              ItemParamGroup dto = new ItemParamGroup(e);
              dto.setItemCatName(itemCatMap.get(e.getItemCatId().intValue()));
            itemParamGroup.add(dto);
        });

        log.info("size={}",itemParamGroupDTOS.size());
        */
        PageHelper.offsetPage(itemParamGroupQuery.getOffset(), itemParamGroupQuery.getLimit());
        long total = dtoList.size();
        resultSet.setRows(dtoList);
        resultSet.setTotal(total);
        return resultSet;
    }

    @Override
    public List<ItemParamGroup> findGroups(List<Long> ids) {
        Weekend<ItemParamGroup> example = Weekend.of(ItemParamGroup.class);
          if (ids.size() < 1 ) {
             return new ArrayList<ItemParamGroup>();
          }
        WeekendCriteria<ItemParamGroup, Object> criteria = example.weekendCriteria();
        criteria.andIn(ItemParamGroup::getId, ids);
        return itemParamGroupMapper.selectByExample(example);
    }

    @Override
    public String findNames(List<Long> ids) {
        StringBuilder s = new StringBuilder();
        findGroups(ids).forEach( o ->{
            s.append(o.getGroupName()+",");
        });
        if (s.length() > 0) {
            s.deleteCharAt(s.length() - 1);
        }
        return s.toString();
    }

  /*        Object o = itemParamGroupList.stream().map(g -> itemParamKeyService.findByGroupId(g.getId())).collect(Collectors.toList());*/
           //log.info("流式遍历：{}",JSON.toJSONString(o));


    private String getItemParamKeyNames(List<Long> ids){
        return itemParamKeyService.findNames(ids);
    }
}
